package cn.ls.service.impl;

import cn.ls.dao.SvnMapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import org.tmatesoft.svn.core.*;
import org.tmatesoft.svn.core.internal.io.dav.DAVRepositoryFactory;
import org.tmatesoft.svn.core.internal.wc.DefaultSVNOptions;
import org.tmatesoft.svn.core.io.SVNRepository;
import org.tmatesoft.svn.core.wc.SVNClientManager;
import org.tmatesoft.svn.core.wc.SVNUpdateClient;

import javax.annotation.Resource;
import java.io.ByteArrayOutputStream;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

/***
 * 查询svn目录
*/
public class SvnService {
	private static final Logger logger = LoggerFactory.getLogger(SvnService.class);

	//    @Inject(instance = PropertyUtil.class)
//    private PropertyUtil propertyUtil;
	
	static {
		DAVRepositoryFactory.setup();
	}
 
	private SVNClientManager manager;
	private SVNUpdateClient updateClient;
	private String url;
	private String userName;
	private String passwd;

	public SvnService() {
	}

	public SvnService(String userName, String passwd) {
		init(userName, passwd);
	}
	
	private void init(String userName,String passwd){
		DefaultSVNOptions options = new DefaultSVNOptions();
		manager = SVNClientManager.newInstance(options);
		manager = SVNClientManager.newInstance(options,userName,passwd); 
		updateClient = manager.getUpdateClient();
		updateClient.setIgnoreExternals(false);
	}
	
	public SvnService(String userName, String passwd, String url){
		this(userName,passwd);
		this.url=url;
	}
	
	/**获取文档内容
	 * @param url
	 * @return
	 */
	public String checkoutFileToString(String url){//"", -1, null
		SVNRepository repository = createRepository(url);
		try {
			SVNDirEntry entry = repository.getDir("", -1, false, null);
			int size = (int)entry.getSize();
			ByteArrayOutputStream outputStream = new ByteArrayOutputStream(size);
			SVNProperties properties = new SVNProperties();
			repository.getFile("", -1, properties, outputStream);
			String doc = new String(outputStream.toByteArray(),Charset.forName("utf-8"));
			return doc;
		} catch (SVNException e) {
			e.printStackTrace();
		}
		return null;
	}
	
	public boolean toParantFolder(){
		if(url!=null){
			StringBuffer sb = new StringBuffer(url);
			if(url.endsWith("/")){
				sb.deleteCharAt(sb.length()-1);
			}
			int index = sb.lastIndexOf("/");
			url=sb.substring(0, index);
			return true;
		}
		return false;
	}
	
	/**进入子目录
	 * @param folder
	 * @return
	 */
	public boolean toChildFolder(String folder){
		if(url!=null){
			StringBuffer sb = new StringBuffer(url);
			boolean a = url.endsWith("/");
			boolean b = folder.startsWith("/");
			if(a^b){
				sb.append(folder);
			}else if(a&b){
				sb.deleteCharAt(sb.length()-1);
				sb.append(folder);
			}else{
				sb.append('/').append(folder);
			}
			if(checkPath(sb.toString())==1){
				this.url=sb.toString();
				return true;
			}
		}
		return false;
	}
	
	/**获取当前目录下的子目录和文件
	 * @return
	 * @throws SVNException
	 */
	public List<SVNDirEntry> listFolder() throws SVNException {
		return listFolder(url);
	}
 
	/**列出指定SVN 地址目录下的子目录
	 * @param url
	 * @return
	 * @throws SVNException
	 */
	public List<SVNDirEntry> listFolder(String url){
		if(checkPath(url)==1){
			
			SVNRepository repository = createRepository(url);
			try {
				Collection<SVNDirEntry> list = repository.getDir("", -1, null, (List<SVNDirEntry>)null);
				List<SVNDirEntry> dirs = new ArrayList<SVNDirEntry>(list.size());
				dirs.addAll(list);
				return dirs;
			} catch (SVNException e) {
				logger.error("listFolder error",e);
			}
 
		}
		return null;
	}

	private SVNRepository createRepository(String url){
		try {
			return manager.createRepository(SVNURL.parseURIEncoded(url), true);
		} catch (SVNException e) {
			logger.error("createRepository error",e);
		}
		return null;
	}
	
	/**检查路径是否存在
	 * @param url
	 * @return 1：存在    0：不存在   -1：出错
	 */
	public int checkPath(String url){
		SVNRepository repository = createRepository(url);
		SVNNodeKind nodeKind;
		try {
			nodeKind = repository.checkPath("", -1);
			boolean result = nodeKind == SVNNodeKind.NONE ? false : true;
			if(result) return 1;
		} catch (SVNException e) {
			logger.error("checkPath error",e);
			return -1;
		}
		return 0;
	}
 
	public String getUrl() {
		return url;
	}
	public void setUrl(String url) {
		this.url = url;
	}
	public String getUserName() {
		return userName;
	}
	public void setUserName(String userName) {
		this.userName = userName;
	}
	public String getPasswd() {
		return passwd;
	}
	public void setPasswd(String passwd) {
		this.passwd = passwd;
	}
	public static void main(String[] args) throws SVNException {
		String url = "http://xxx.xxx.xxx.xxx/xxx";
		SvnService svn = new SvnService("xxx", "xxx");
		String xml = svn.checkoutFileToString(url);
		System.out.println(xml);
	}

}